https://leetcode.cn/problems/fruit-into-baskets/submissions/560517945/

class Solution {
public:
    int totalFruit(vector<int>& fruits) {
        // 初始化两个篮子的水果类型，type1为第一个水果类型，type2初始化为一个不可能存在的值
        int type1 = fruits[0], type2 = fruits.size(), t2 = 0, sum = 0;
        
        // 使用双指针 slow 和 fast 来表示当前窗口的左右边界
        for (int slow = 0, fast = 1; slow < fruits.size() && fast < fruits.size();) {
            // 如果遇到一个新的水果类型（不是type1），并且type2还没有被赋值
            if (fruits[fast] != type1 && type2 == fruits.size()) {
                // 将新的水果类型赋值给type2，并更新最大数量
                type2 = fruits[fast];
                sum = sum > (fast - slow) ? sum : (fast - slow);
                // 记录type2出现的位置
                t2 = fast;
                fast++;
            }
            // 如果遇到一个新的水果类型（既不是type1也不是type2）
            else if (fruits[fast] != type1 && fruits[fast] != type2) {
                // 更新slow指针到type2第一次出现的位置
                slow = t2;
                // 更新type1为新的起点的水果类型
                type1 = fruits[slow];
                // 更新type2为新遇到的水果类型
                type2 = fruits[fast];
            } else {
                // 如果当前水果与前一个水果不同，更新t2
                if (fruits[fast] != fruits[fast - 1]) {
                    t2 = fast;
                }
                // 更新最大数量
                sum = sum > (fast - slow) ? sum : (fast - slow);
                fast++;
            }
        }

        // 返回最大数量加1，因为sum是索引差值
        return sum + 1;
    }
};